/**
 * * 将数值限制在指定的最小值和最大值范围内
 *
 * @param {type.Vertex} input 包含数字范围的 Vertex 对象
 *
 * @param {number} value 用于测试的数值
 *
 * @returns {number} 限制后的数值, 确保在 [range.min, range.max] 区间内
 */
function Clamp({ min, max }, value) {
    return Math.max(min, Math.min(max, value));
};
/**
 * * 线性插值函数
 *
 * @param {number} start 插值的起始值
 *
 * @param {number} end 插值的结束值
 *
 * @param {number} t 插值参数, 范围在 [0, 1] 之间
 *
 * @returns {number} 插值结果, 范围在 [start, end] 之间
 */
function Lerp(start, end, t) {
    return start + (end - start) * t;
};
/**
 * * 平滑插值函数
 *
 * @param {number} start 插值的起始值
 *
 * @param {number} end 插值的结束值
 *
 * @param {number} t 插值参数, 范围在 [0, 1] 之间
 *
 * @returns {number} 插值结果, 范围在 [start, end] 之间
 */
function Smoothstep(start, end, t) {
    t = Clamp({ min: 0, max: 1 }, t);
    const smoothedT = t * t * (3 - 2 * t);
    return start + (end - start) * smoothedT;
};
/**
 * * 立方插值函数
 *
 * @param {number} start 插值的起始值
 *
 * @param {number} end 插值的结束值
 *
 * @param {number} t 插值参数, 范围在 [0, 1] 之间
 *
 * @returns {number} 插值结果, 范围在 [start, end] 之间
 */
function Cubic(start, end, t) {
    t = Clamp({ min: 0, max: 1 }, t);
    return start + (end - start) * t * t * (3 - 2 * t);
};
/**
 * * 生成指定范围内的随机整数
 *
 * @param {number} min - 范围的最小值（包含在内）
 *
 * @param {number} max - 范围的最大值（包含在内）
 *
 * @returns {number} 返回 min 和 max 之间的一个随机整数, 包括 min 和 max
 */
function RandomFloor(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
};
/**
 * * 生成一个在指定范围内的随机浮点数, 并保留指定的小数位数
 *
 * @param {number} min - 随机数范围的最小值（包含）
 *
 * @param {number} max - 随机数范围的最大值（包含）
 *
 * @param {number} length - 返回的浮点数的小数位数, 默认为2
 *
 * @returns {number} 在指定范围内的随机浮点数, 保留指定的小数位数
 */
function RandomFloat(min, max, length = 2) {
    return Number((Math.random() * (max - min) + min).toFixed(length));
};
/**
 * * 计算数组的中位数
 *
 * @param {number[]} numbers - 输入的数字数组
 *
 * @returns {number} - 返回数组的中位数
 */
function CalculateMedian(numbers) {
    /**
     * * 复制输入的数组并排序, 避免修改原数组
     */
    const sortedNumbers = [...numbers].sort((a, b) => a - b);
    /**
     * * 计算中位数索引
     */
    const middleIndex = Math.floor(sortedNumbers.length / 2);
    // 如果数组长度是偶数, 返回中间两个数的平均
    if (sortedNumbers.length % 2 === 0) return (sortedNumbers[middleIndex - 1] + sortedNumbers[middleIndex]) / 2;
    // 如果数组长度是奇数, 返回中间的数
    else return sortedNumbers[middleIndex];
};
/**
 * * 计算数组中的众数
 *
 * @param {number[]} numbers - 输入的数字数组
 *
 * @returns {number[]} - 返回一个包含所有众数的数组
 */
function CalculateModes(numbers) {
    /**
     * * 用于存储数字出现的频率
     */
    const frequencyMap = new Map();
    /**
     * * 用于存储最大频率
     */
    let maxFrequency = 0;
    /**
     * * 用于存储所有众数
     */
    const modes = [];
    // 遍历数组, 统计每个数字出现的频率
    for (const number of numbers) {
        /**
         * * 获取当前数字的频率
         */
        const frequency = (frequencyMap.get(number) || 0) + 1;
        // 更新频率映射
        frequencyMap.set(number, frequency);
        // 更新最大频率
        if (frequency > maxFrequency) maxFrequency = frequency;
    };
    // 再次遍历频率映射, 找出所有众数
    frequencyMap.forEach(
        (frequency, number) => {
            if (frequency === maxFrequency) modes.push(number);
        }
    );
    // 返回所有众数
    return modes;
};